package muhnes.sizoo.controlador;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import javax.faces.application.FacesMessage;
import javax.faces.model.SelectItem;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import org.primefaces.event.FlowEvent;
import muhnes.sizoo.dal.FabricaDAO;
import muhnes.sizoo.dal.FamiliaDao;
import muhnes.sizoo.dal.FamiliaDaoImpl;
import muhnes.sizoo.dal.SuperfamiliaDao;
import muhnes.sizoo.dal.SuperfamiliaDaoImpl;
import muhnes.sizoo.modelo.Familia;
import muhnes.sizoo.modelo.Superfamilia;
import muhnes.sizoo.util.Transaccion;

/**
 * Clase donde se definen los metodos que controlan la vista de familias
 * @author Ricardo Orellana
 */
@ManagedBean(name = "familiaBean")
@ViewScoped
public class FamiliaBean extends CRUDBean< Familia, FamiliaDao > 
    implements Serializable {
    
    private List< SelectItem > itemsEstado;
    private List< SelectItem > listaSuperfamilia;
    
    /**
     * Constructor de la clase FamiliaBean
     */
    public FamiliaBean() {
        super( Familia.class );
        vistaProtegida = "familia";
    }
 
    /**
     * Metodo que devuelve una lista de estados
     * 
     */
    public List<SelectItem> getItemsEstado() {
        if(itemsEstado == null){
            itemsEstado = new ArrayList< SelectItem >();
            itemsEstado.add( new SelectItem("", "Seleccione...") );
            itemsEstado.add( new SelectItem("Habilitado", "Habilitado") );
            itemsEstado.add( new SelectItem("Deshabilitado", "Deshabilitado") );
        }
        return itemsEstado;
    } 
    
    /**
     * Metodo que se encarga de eliminar una entidad
     * @param event 
     */
    @Override
    public void eliminarEntidad( ActionEvent event ){
        if( !validarDependencia() ) {
            return;
        }
        
        FamiliaDao familiaDao = FabricaDAO.crearFamiliaDao();
        entidad.setHabilitado(Boolean.FALSE);
        familiaDao.actualizar( entidad );
        recrearModelo();
    }
    
    /**
     * metodo que devuelve una lista de superfamilias
     *  
     */
    public List< SelectItem > getListaSuperfamilia() {
        if( listaSuperfamilia == null ) {
            listaSuperfamilia = new ArrayList< SelectItem >();
            SuperfamiliaDao familiaDao = FabricaDAO.crearSuperfamiliaDao();
            for( Superfamilia superfamilia : familiaDao.buscarHabilitados() ) {
                Superfamilia s = familiaDao.removerProxy( superfamilia );
                SelectItem item = new SelectItem( s, s.getNombre());
                listaSuperfamilia.add( item );
            }
        }
        return listaSuperfamilia;
    }

    /**
     * Metodo que instancia una nueva familia
     *  
     */
    @Override
    protected FamiliaDao getDAO () {
        return FabricaDAO.crearFamiliaDao();
    }

    /**
     * 
     * @param transaccion indica que transaccion se debera realizar 
     * @return objeto de tipo boolean que indica que tipo de transaccion se realizara
     */
    @Override
    protected boolean debeValidar (Transaccion transaccion) {
        boolean validacion = false;
        
        switch( transaccion ) {
            case INSERCION:
            case ACTUALIZACION:
            case ELIMINACION:
                validacion = true;
        }
        
        return validacion;
    }
    
}
